UserDetailsService ইন্টারফেস এবং Custom UserDetails তৈরি

Java Technologies - স্প্রিং সিকিউরিটি (Spring Security) - Spring Security এর Authentication এবং Authorization
131

Spring Security-তে UserDetailsService ইন্টারফেসটি একটি কেন্দ্রীয় ভূমিকা পালন করে। এটি এমন একটি কনট্রাক্ট প্রদান করে যার মাধ্যমে Spring Security আপনার অ্যাপ্লিকেশনের ব্যবহারকারী ডেটা লোড করতে পারে। এটি সাধারণত ডেটাবেস থেকে ব্যবহারকারী তথ্য রিট্রিভ করতে ব্যবহৃত হয়।


UserDetailsService ইন্টারফেস

UserDetailsService Spring Security-এর একটি প্রধান ইন্টারফেস যা শুধুমাত্র একটি মেথড প্রদান করে:

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
  • Parameter:
    • username: ব্যবহারকারীর নাম যা লগইন করার সময় সরবরাহ করা হয়।
  • Return Type:
    • এটি একটি UserDetails অবজেক্ট রিটার্ন করে যা ব্যবহারকারীর তথ্য ধারণ করে।
  • Exception:
    • যদি ব্যবহারকারী পাওয়া না যায়, তাহলে এটি UsernameNotFoundException ছুড়ে দেয়।

Custom UserDetails তৈরি

Spring Security ডিফল্টভাবে org.springframework.security.core.userdetails.User ক্লাসটি ব্যবহার করে। তবে, যদি আপনার অ্যাপ্লিকেশনের জন্য অতিরিক্ত ব্যবহারকারী তথ্য (যেমন phoneNumber, address) প্রয়োজন হয়, তাহলে আপনাকে একটি custom UserDetails ক্লাস তৈরি করতে হবে।

১. Custom UserDetails ক্লাস তৈরি করুন

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

public class CustomUserDetails implements UserDetails {

    private String username;
    private String password;
    private boolean isEnabled;
    private Collection<? extends GrantedAuthority> authorities;
    private String phoneNumber; // Custom attribute

    public CustomUserDetails(String username, String password, boolean isEnabled, 
                              Collection<? extends GrantedAuthority> authorities, 
                              String phoneNumber) {
        this.username = username;
        this.password = password;
        this.isEnabled = isEnabled;
        this.authorities = authorities;
        this.phoneNumber = phoneNumber;
    }

    // Standard UserDetails methods
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return isEnabled;
    }

    // Custom getter
    public String getPhoneNumber() {
        return phoneNumber;
    }
}

২. Custom UserDetailsService ইমপ্লিমেন্ট করুন

UserDetailsService ইন্টারফেসটি ইমপ্লিমেন্ট করুন এবং আপনার ডেটাবেস থেকে ব্যবহারকারী ডেটা লোড করার জন্য এটি কাস্টমাইজ করুন।

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Collections;

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // Replace this with your database query
        if (!"testuser".equals(username)) {
            throw new UsernameNotFoundException("User not found with username: " + username);
        }

        // Simulated user data
        String password = "$2a$10$abc123..."; // BCrypt hashed password
        boolean isEnabled = true;
        String phoneNumber = "123-456-7890";

        // Return custom UserDetails
        return new CustomUserDetails(username, password, isEnabled, Collections.emptyList(), phoneNumber);
    }
}

৩. Custom UserDetailsService Spring Security Configuration-এ যুক্ত করুন

Spring Security configuration ক্লাসে CustomUserDetailsService ইমপ্লিমেন্টেশন ইনজেক্ট করুন।

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    private final CustomUserDetailsService userDetailsService;

    public SecurityConfig(CustomUserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeRequests()
                .anyRequest().authenticated()
            .and()
            .formLogin();

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
        return http.getSharedObject(AuthenticationManagerBuilder.class)
                   .userDetailsService(userDetailsService)
                   .passwordEncoder(passwordEncoder())
                   .and()
                   .build();
    }
}

৪. Custom UserDetails Access করা

Spring Security-এর মাধ্যমে লগইন করার পরে, ব্যবহারকারীর ডেটা অ্যাক্সেস করতে Authentication অবজেক্ট ব্যবহার করুন।

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

public class UserService {

    public void getCurrentUserDetails() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal();

        System.out.println("Username: " + userDetails.getUsername());
        System.out.println("Phone Number: " + userDetails.getPhoneNumber());
    }
}

উপসংহার

Spring Security-এর UserDetailsService ইন্টারফেস এবং Custom UserDetails ক্লাস ব্যবহার করে একটি highly customizable authentication ব্যবস্থা তৈরি করা যায়। ডেটাবেস থেকে ব্যবহারকারী তথ্য সংগ্রহ এবং লগইন প্রক্রিয়ার সময় ব্যবহারকারী যাচাই করার জন্য এই পদ্ধতি কার্যকর। Spring Security-এর সুবিধা ব্যবহার করে নিরাপত্তা ব্যবস্থা আরও শক্তিশালী করতে এই ধরণের কাস্টমাইজেশন অপরিহার্য।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...